/**
 * 将数组按指定大小分割为若干子数组。此函数的行为与[PHP的array_chunk](http://php.net/manual/en/function.array-chunk.php)函数一致，
 * 因此如果输入数组的长度不能被分割大小整除，则会在末尾插入较小的子数组。
 *
 * `x` 应为一个数组，`chunkSize` 应为一个正整数。
 * 数组 `x` 可以包含任意类型的数据。
 *
 * @param {Array} x 样本数据数组
 * @param {number} chunkSize 每个子数组的大小，必须为正整数
 * @returns {Array<Array>} 分割后的二维数组
 * @throws {Error} 如果分割大小小于1或不是整数，则抛出错误
 * @example
 * chunk([1, 2, 3, 4, 5, 6], 2);
 * // => [[1, 2], [3, 4], [5, 6]]
 */
function chunk(x, chunkSize) {
    // 存储分割结果的二维数组
    const output = [];

    // `chunkSize` 必须大于零，否则在下面的循环中，
    // 调用 `start += chunkSize` 会导致无限循环。
    // 因此，我们在此检测并抛出异常以指示无效输入。
    if (chunkSize < 1) {
        throw new Error("分割大小必须为正数");
    }

    if (Math.floor(chunkSize) !== chunkSize) {
        throw new Error("分割大小必须为整数");
    }

    // `start` 是 `.slice` 方法开始选择新数组元素的索引
    for (let start = 0; start < x.length; start += chunkSize) {
        // 对于每个子数组，使用 `.slice` 方法提取部分数组并将其添加到输出结果中。
        // `.slice` 方法不会改变原始数组。
        output.push(x.slice(start, start + chunkSize));
    }
    return output;
}

export default chunk;
